/*
 * ========================================================
 * Copyright(c) 2014 杭州龙骞科技-版权所有
 * ========================================================
 * 本软件由杭州龙骞科技所有, 未经书面许可, 任何单位和个人不得以
 * 任何形式复制代码的部分或全部, 并以任何形式传播。
 * 公司网址
 * http://www.hzdracom.com/
 * ========================================================
 */
package utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import java.util.UUID;

/**
 * 
 * 设备信息
 * @author 刘宾  
 * @date 2015年4月29日 下午2:39:26
 */
public class DeviceUtils
{
	private static Context context;
	private static DeviceUtils      util;
	private static TelephonyManager tm;
	private DeviceUtils(Context context){
		this.context = context.getApplicationContext();
	}
	public static DeviceUtils getInstance(Context context){
		if(null==util) util= new DeviceUtils(context);
		tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		return util;
	}

	/** 打印设备信息 */
	public void printInfo(){
		StringBuffer sb = new StringBuffer("设备信息：\n");
		sb.append("getID:").append(getID()).append("\n");
		sb.append("getAndroidId:").append(getAndroidId()).append("\n");
		sb.append("getDeviceId:").append(getDeviceId()).append("\n");
		sb.append("getUUID:").append(getUUID()).append("\n");
		sb.append("getNumber:").append(getNumber()).append("\n");
		sb.append("getSubscriberId:").append(getSubscriberId()).append("\n");
		sb.append("getSimSerialNumber:").append(getSimSerialNumber()).append("\n");
		sb.append("getSerialNumber:").append(getSerialNumber()).append("\n");
		sb.append("getPhoneType:").append(getPhoneType()).append("\n");
		sb.append("getNetworkType:").append(getNetworkType()).append("\n");
		System.out.println(sb.toString());
	}

	/**
	 * 在设备首次启动时，系统会随机生成一个64位的数字，并把这个数字以16进制字符串的形式保存下来，
	 * 这个16进制的字符串就是ANDROID_ID，当设备被wipe后该值会被重置
	 * @return
	 */
	public static String getAndroidId(){
		final String androidId = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
		return TextUtils.isEmpty(androidId) ? "" : androidId;
	}
	/**
	 2  * 获取版本号
	 3  * @return 当前应用的版本号
	 4  */
	   public static String getVersion(Context ctx) {
	      try {
	          PackageManager manager = ctx.getPackageManager();
	          PackageInfo info = manager.getPackageInfo(ctx.getPackageName(), 0);
	           String version = info.versionName;
	          return  version;
	       } catch (Exception e) {
	          e.printStackTrace();
	          return null;
	      }
	  }
	
	
	//	"手机型号:" + android.os.Build.MODEL + 
	//	  ",SDK版本:" + android.os.Build.VERSION.SDK + 
	//	  ",系统版本:" + android.os.Build.VERSION.RELEASE+
	//	  ",软件版本:"+getAppVersionName(MainActivity.this);

	/**
	 * 获取系统版本
	 * @return
	 */
	public static String getSystomVerson(){
		return android.os.Build.VERSION.RELEASE;
	}
	/**
	 * 获取手机型号
	 * @return
	 */
	public static String getPhoneModel(){
		return android.os.Build.MODEL;
	}
	/**
	 * 获取手机厂商
	 * @return
	 */
	public static String getPhoneManuFacturers(){
		return android.os.Build.MANUFACTURER;
	}
	/**
	 * 随机生成一个UUID
	 * @return
	 */
	public static String getUUID(){
		return UUID.randomUUID().toString();
	}


	/**
	 * 在设备上获取绝对的唯一标识，
	 * 先获取DeviceId,如果为空,获取ANDROID_ID,如果还是空,生成一个UUID
	 * @return
	 */
	public String getID(){
		String result = getDeviceId();
		if(TextUtils.isEmpty(result)){
			result = getAndroidId();
			if(TextUtils.isEmpty(result)){
				result = getUUID();
			}
		}
		return result;
	}

	/**
	 * 返回当前移动终端的唯一标识
	 * 
	 * 如果是GSM网络，返回IMEI；如果是CDMA网络，返回MEID。<br>
	 * 权限： 获取DEVICE_ID需要READ_PHONE_STATE权限
	 */
	public static String getDeviceId(){
		final String deviceId = tm.getDeviceId();
		return TextUtils.isEmpty(deviceId) ? "" : deviceId;
	}

	/**
	 * 返回手机号码<可能为空>
	 * @return
	 */
	public static String getNumber(){
		final String number = tm.getLine1Number();
		return TextUtils.isEmpty(number) ? "" : number;
	}
	/**
	 * 返回用户唯一标识，比如GSM网络的IMSI编号
	 * @return
	 */
	public static String getSubscriberId(){
		final String subscriberId = tm.getSubscriberId();
		return TextUtils.isEmpty(subscriberId) ? "" : subscriberId;
	}
	/**
	 * 返回SIM卡的序列号(IMEI)
	 * 注意：对于CDMA设备，返回的是一个空值！
	 * @return
	 */
	public static String getSimSerialNumber(){
		final String simSerialNumber = tm.getSimSerialNumber();
		return TextUtils.isEmpty(simSerialNumber) ? "" : simSerialNumber;
	}
	/**
	 * 返回序列号
	 * <Android 2.3以上可以使用此方法>
	 * @return
	 */
	@SuppressLint("NewApi")
	public static String getSerialNumber(){
		final String serialNumber = android.os.Build.SERIAL;
		return TextUtils.isEmpty(serialNumber) ? "" : serialNumber;
	}

	/**
	 * 返回移动终端的类型
	 * <pre>
	 * 0：PHONE_TYPE_NONE 手机制式未知,可能是平板
	 * 1：PHONE_TYPE_GSM  手机制式为GSM，移动和联通
	 * 2：PHONE_TYPE_CDMA 手机制式为CDMA，电信
	 * </pre>
	 */
	public static int getPhoneType(){
		return tm.getPhoneType();
	}
	/**
	 * 获取网络类型
	 * <pre>
	 * NETWORK_TYPE_CDMA   网络类型为CDMA
	 * NETWORK_TYPE_EDGE   网络类型为EDGE
	 * NETWORK_TYPE_EVDO_0 网络类型为EVDO0
	 * NETWORK_TYPE_EVDO_A 网络类型为EVDOA
	 * NETWORK_TYPE_GPRS   网络类型为GPRS
	 * NETWORK_TYPE_HSDPA  网络类型为HSDPA
	 * NETWORK_TYPE_HSPA   网络类型为HSPA
	 * NETWORK_TYPE_HSUPA  网络类型为HSUPA
	 * NETWORK_TYPE_UMTS   网络类型为UMTS
	 * 
	 * 在中国，
	 * 联通的3G为UMTS或HSDPA，
	 * 移动和联通的2G为GPRS或EGDE，
	 * 电信的2G为CDMA，
	 * 电信的3G为EVDO
	 * </pre>
	 */
	public static int getNetworkType(){
		return tm.getNetworkType();
	}

}
